// https://xiaoman.blog.csdn.net/article/details/132797154

const path = require('path')
const { exec, execSync, execFile, spawn } = require('child_process')

// TODO Nodejs创建子进程共有7个API Sync同步API 不加是异步API ,执行shell命令
// spawn 执行命令 返回的是流边执行边返回，spawn是无上限的。
// spawnSync 执行命令 同步执行
// exec 执行命令 返回一个完整的buffer，buffer的大小是200k
// execSync 执行命令 同步执行
// execFile 执行可执行文件
// fork 创建node子进程
// execFileSync 执行可执行文件 同步执行

// TODO options 配置项
// cwd <string> 子进程的当前工作目录。
// env <Object> 环境变量键值对。
// encoding <string> 默认为 'utf8'。
// shell <string> 用于执行命令的 shell。 在 UNIX 上默认为 '/bin/sh'，在 Windows 上默认为 process.env.ComSpec。 详见 Shell Requirements 与 Default Windows Shell。
// timeout <number> 默认为 0。
// maxBuffer <number> stdout 或 stderr 允许的最大字节数。 默认为 200*1024。 如果超过限制，则子进程会被终止。 查看警告： maxBuffer and Unicode。
// killSignal <string> | <integer> 默认为 'SIGTERM'。
// uid <number> 设置该进程的用户标识。（详见 setuid(2)）
// gid <number> 设置该进程的组标识。（详见 setgid(2)）

// TODO 异步执行(exec) shell命令
exec('node -v', {}, (err, stdout, stderr) => {
	if (err) {
		return err
	}
	// console.log(stdout.toString());
})

// TODO 同步执行(execSync) shell命令
const nodeVersion = execSync('node -v', {})
// console.log(nodeVersion.toString());

// TODO 执行文件(execFile) ,
// FIXME 这里没通，先不管 https://xiaoman.blog.csdn.net/article/details/132797154
execFile(path.resolve(__dirname, './bat.cmd'), null, (err, stdout) => {
	// console.log(stdout.toString());
})

// TODO spawn  spawn 用于执行一些实时获取的信息
const { stdout } = spawn('netstat', ['-an'], {})

//返回的数据用data事件接受
stdout.on('data', steram => {
	console.log(steram.toString())
})
stdout.on('close', () => {
	console.log('完毕')
})

// TODO fork 场景适合大量的计算，或者容易阻塞主进程操作的一些代码，就适合开发fork
// const {fork} = require('child_process')

// const testProcess = fork('./test.js')

// testProcess.send('我是主进程')

// testProcess.on("message",(data)=>{
//     console.log('我是主进程接受消息111：',data)
// })

// //
// process.on('message',(data)=>{

// 	console.log('子进程接受消息：',data)
// })

// process.send('我是子进程')
